package lab.chapter;

import java.util.List;

/**
 * Token 流
 * 可以 read 或 peekToken
 * 可以通过 unread、setPosition 回滚
 */
public class TokenReader {
    List<Token> tokens = null;
    // 当前指针
    int pos = 0;

    public TokenReader(List<Token> tokens) {
        this.tokens = tokens;
    }

    /**
     * 读取一个Token，并移动指针
     * @return 如果已经读完，返回 null
     */
    public Token read() {
        if (pos < tokens.size()) {
            return tokens.get(pos++);
        }
        return null;
    }

    /**
     * 预读一个 Token
     * @return 如果已经读完，返回null
     */
    public Token peek() {
        if (pos < tokens.size()) {
            return tokens.get(pos);
        }
        return null;
    }

    /**
     * 回溯一个 Token
     */
    public void unread() {
        if (pos > 0) {
            pos --;
        }
    }

    /**
     * 获取当前位置
     * @return 当前位置
     */
    public int getPosition() {
        return pos;
    }

    /**
     * 设置当前指针位置，用于回溯
     * @param position 设置的位置
     */
    public void setPosition(int position) {
        if (position >= 0 && position < tokens.size())
            pos = position;
    }

}
